package team.archai.nexus.flow.service;

import org.activiti.engine.delegate.DelegateExecution;
import org.activiti.engine.delegate.DelegateTask;
import team.archai.nexus.flow.constant.ProcessConstant;
import team.archai.nexus.flow.vo.AssigneeVO;
import team.archai.nexus.flow.vo.FlowListenerVO;
import team.archai.nexus.flow.vo.FlowModelVO;

import java.util.List;

/**
 * @author li shi bin
 * @desc: 流程设计器流程统一管理类
 */
public interface IProcessManage {

    /**
     * 分类获取受理人
     *
     * @param type 指定人类型
     * @param <A>  受理人泛型
     * @return 受理人集合
     */
    <A extends AssigneeVO> List<A> assignees(Integer type);

    /**
     * 获取默认任务监听器集合
     *
     * @return 流程默认任务监听集合
     */
    default List<FlowListenerVO> taskListeners() {
        return ProcessConstant.TASK_LISTENERS;
    }

    /**
     * 获取默认执行监听器集合
     *
     * @return 流程默认执行监听集合
     */
    default List<FlowListenerVO> execListeners() {
        return ProcessConstant.EXEC_LISTENERS;
    }

    /**
     * 流程任务创建
     *
     * @param delegateTask 任务
     */
    default void onCreate(DelegateTask delegateTask) {
    }

    /**
     * 流程任务删除
     *
     * @param delegateTask 任务
     */
    default void onDelete(DelegateTask delegateTask) {
    }

    /**
     * 流程任务分配
     *
     * @param delegateTask 任务
     */
    default void onAssignment(DelegateTask delegateTask) {
    }

    /**
     * 流程任务完成
     *
     * @param delegateTask 任务
     */
    default void onComplete(DelegateTask delegateTask) {
    }

    /**
     * 流程任务创建
     *
     * @param execution 执行阶段
     */
    default void onStart(DelegateExecution execution) {
    }

    /**
     * 节点结束
     *
     * @param execution 执行阶段
     */
    default void onEnd(DelegateExecution execution) {
    }

    /**
     * 节点被获取
     *
     * @param execution 执行阶段
     */
    default void onTake(DelegateExecution execution) {
    }

    /**
     * 模型被发布
     *
     * @param flowModelVO 模型参数
     */
    default void onDeployModel(FlowModelVO flowModelVO) {
    }

    /**
     * 根据模型id获取模型数据
     *
     * @param flowModelId 模型id
     * @return 模型详情
     */
    default FlowModelVO getModelById(String flowModelId) {
        return null;
    }
}
